package br.com.lacibMusic.bean;

import br.com.lacibMusic.entidades.Album;
import br.com.lacibMusic.entidades.Disco;
import br.com.lacibMusic.entidades.Musica;
import br.com.lacibMusic.rn.AlbumRN;
import br.com.lacibMusic.rn.DiscoRN;
import br.com.lacibMusic.rn.MusicaRN;
import br.com.lacibMusic.upload.FTPUpload;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

@ManagedBean
@ViewScoped
public class AlbumBean implements Serializable {

    private MusicaRN musicaRN = new MusicaRN();
    private Musica musica = new Musica();
    private List<Musica> musicas;
    private DiscoRN discoRN = new DiscoRN();
    private Disco disco = new Disco();
    private List<Disco> discos;
    private AlbumRN albumRN = new AlbumRN();
    private Album album = new Album();
    private List<Album> albuns;
    private final FTPUpload ftpUpload = new FTPUpload();
    private byte[] grafico;
    private InputStream fileInputStream;
    private String renderLista;

    public String getTitulo() {
        iniciarBean();
        return "Cadastro - Álbum";
    }

    public void iniciarBean() {
        albuns = albumRN.obterTodos();
        renderLista = "1";
    }

    public AlbumBean() {
    }

    public Album getAlbum() {
        return album;
    }

    public void setAlbum(Album album) {
        this.album = album;
    }

    public Disco getDisco() {
        return disco;
    }

    public void setDisco(Disco disco) {
        this.disco = disco;
    }

    public Musica getMusica() {
        return musica;
    }

    public void setMusica(Musica musica) {
        this.musica = musica;
    }

    public List<Musica> getMusicas() {
        musicas = null;
        if (musicas == null) {
            musicas = musicaRN.obterTodosPorDisco(disco);
        }
        return musicas;
    }

    public void setMusicas(List<Musica> musicas) {
        this.musicas = musicas;
    }

    public AlbumRN getAlbumRN() {
        return albumRN;
    }

    public void setAlbumRN(AlbumRN albumRN) {
        this.albumRN = albumRN;
    }

    public List<Album> getAlbuns() {
        albuns = null;
        if (albuns == null) {
            albuns = albumRN.obterTodos();
        }
        return albuns;
    }

    public void setAlbuns(List<Album> albums) {
        this.albuns = albums;
    }

    public List<Disco> getDiscos() {
        discos = null;
        if (discos == null) {
            discos = discoRN.obterTodosPorAlbum(album);
        }
        return discos;
    }

    public void setDiscos(List<Disco> discos) {
        this.discos = discos;
    }

    public void uploadCapa(FileUploadEvent event) {
        //  UploadedFile Uploadfile = event.getFile().getInputstream();
        System.out.println("InputStream");
        try {
            fileInputStream = event.getFile().getInputstream();

            grafico = new byte[(int) fileInputStream.available()];
            //  FileInputStream fileInputStream;
            //   fileInputStream = new FileInputStream(chart);
            //fileInputStream.read(grafico);
        } catch (IOException ex) {
            System.out.println("Ex: " + ex);
        }
    }

    public StreamedContent downloadCapa() {
        StreamedContent image = null;
        if (album.getImgAlbum() == null) {
            System.out.println("IMAGEM NULL");
        } else {
            image = new DefaultStreamedContent(new ByteArrayInputStream(grafico));
            System.out.println("IMAGEM: " + image);
        }
        return image;
    }

    public SelectItem[] getSelos() {
        return albumRN.getSelos();
    }

    public void salvar() {
        if (!albumRN.obterPorNome(album.getNomeAlbum()).isEmpty()) {
            BeanUtil.criarMensagemDeErro("Erro ao salvar.", "Verifique se já não existe música com esse nome na base de dados.");
        } else {
            if (album.getNomeAlbum() != null) {
                album.setImgAlbum(("http://lacibUfra.net/lacibMusic/Imagem/" + album.getNomeAlbum() + ".png"));
                if (ftpUpload.uploadFTP(fileInputStream, "Imagem", album.getNomeAlbum()).equalsIgnoreCase("Sucesso")) {
                    if (albumRN.salvar(album)) {
                        BeanUtil.criarMensagemDeInformacao("Operação Realizada com Sucesso", "Album Salvo na Lista");
                    } else {
                        BeanUtil.criarMensagemDeErro("Erro ao salvar.", "O Album não pode ser salvo.");
                    }
                } else {
                    BeanUtil.criarMensagemDeErro("Erro ao salvar.", "Erro ao salvar imagem no servidor.");
                }
            } else {
                BeanUtil.criarMensagemDeErro("Erro ao salvar.", "A imagem não pode ser salva.");
            }
        }
        try {
            fileInputStream.close();
        } catch (IOException ex) {
            Logger.getLogger(AlbumBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        album = null;
    }

    public void voltar() {
        album = null;
        renderLista = "1";
    }

    public void novo() {
        if (album == null) {
            album = albumRN.novo();
        }
        renderLista = "2";
    }

    public void excluirAlbum() {
        if (albumRN.remover(album)) {
            BeanUtil.criarMensagemDeInformacao("Album Removido com sucesso.", "Album: " + album.getNomeAlbum());
        } else {
            BeanUtil.criarMensagemDeErro("Erro ao remover Album.", "O Album não pode ser removido.");
        }
        album = null;
        voltar();
    }
    
    public void excluirDisco() {
        if (discoRN.remover(disco)) {
            BeanUtil.criarMensagemDeInformacao("Disco Removido com sucesso.", "Disco: " + disco.getNomeDisco());
        } else {
            BeanUtil.criarMensagemDeErro("Erro ao remover Disco.", "O Disco não pode ser removido.");
        }
        disco = null;
        voltarDisco();
    }
    
    public void excluirMusica() {
        if (musicaRN.remover(musica)) {
            BeanUtil.criarMensagemDeInformacao("Musica Removido com sucesso.", "Musica: " + disco.getNomeDisco());
        } else {
            BeanUtil.criarMensagemDeErro("Erro ao remover Musica.", "O Musica não pode ser removido.");
        }
        musica = null;
        voltarMusica();
    }

    public void cancelarAlbum() {
        album = null;
        albuns = null;
        renderLista = "1";
        voltar();
    }
    
    public void cancelarDisco() {
        disco = null;
        discos = null;
        renderLista = "3";
        voltarDisco();
    }
    
    public void cancelarMusica() {
        musica = null;
        musicas = null;
        renderLista = "5";
        voltarMusica();
    }
    
    
    public void salvarDisco() {
        disco.setAlbumid(album);
            if (discoRN.salvar(disco)) {
                BeanUtil.criarMensagemDeInformacao("Operação Realizada com Sucesso", "Disco Salvo na Lista");
            } else {
                BeanUtil.criarMensagemDeErro("Erro ao salvar", "O Disco não pode ser salvo.");
            }
        disco = null;
    }

    public void voltarDisco() {
        disco = null;
        renderLista = "3";
    }

    public void novoDisco() {
        if (disco == null) {
            disco = discoRN.novo();
            disco.setAlbumid(album);
        }
        renderLista = "4";
    }
    
    public void irDiscos() {
        renderLista = "3";
    }

    public void irExcluirMusica() {
        renderLista = "9";
    }
    
    public void irExcluirAlbum() {
        renderLista = "7";
    }
    
    public void irExcluirDisco() {
        renderLista = "8";
    }
    
    public void salvarMusica() {
        musica.setDiscoid(disco);
        if (!musicaRN.obterPorNome(musica.getNomeMusica()).isEmpty()) {
            BeanUtil.criarMensagemDeErro("Erro ao salvar.", "Verifique se já não existe música com esse nome na base de dados.");
        } else {
            if (musica.getNomeMusica() != null) {
                musica.setMusica(("http://lacibUfra.net/lacibMusic/Audio/" + musica.getNomeMusica() + ".mp3"));
                if (ftpUpload.uploadFTP(fileInputStream, "Audio", musica.getNomeMusica()).equalsIgnoreCase("Sucesso")) {
                    if (musicaRN.salvar(musica)) {
                        BeanUtil.criarMensagemDeInformacao("Operação Realizada com Sucesso", "Musica Salvo na Lista");
                    } else {
                        BeanUtil.criarMensagemDeErro("Erro ao salvar", "A Musica não pode ser salvo.");
                    }
                }
            }
        }
        try {
            fileInputStream.close();
        } catch (IOException ex) {
            Logger.getLogger(MusicaBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        musica = null;
    }

    public void voltarMusica() {
        musica = null;
        renderLista = "5";
    }

    public void novoMusica() {
        if (musica == null) {
            musica = musicaRN.novo();
        }
        renderLista = "6";
    }

    public void uploadMusica(FileUploadEvent event) {
        //  UploadedFile Uploadfile = event.getFile().getInputstream();
        System.out.println("InputStream");
        try {
            fileInputStream = event.getFile().getInputstream();
            grafico = new byte[(int) fileInputStream.available()];
            //  FileInputStream fileInputStream;
            //   fileInputStream = new FileInputStream(chart);
            //fileInputStream.read(grafico);
        } catch (IOException ex) {
            System.out.println("Ex: " + ex);
        }
    }

    public SelectItem[] getArtistas() {
        return musicaRN.getArtistas();
    }

    public SelectItem[] getCompositores() {
        return musicaRN.getCompositores();
    }

    public SelectItem[] getGenerosMusicais() {
        return musicaRN.getGeneroMusical();
    }

    public void irMusicas() {
        renderLista = "5";
    }

    public String getRenderLista() {
        return renderLista;
    }

    public void setRenderLista(String renderLista) {
        this.renderLista = renderLista;
    }
}
